package geradatawarehouse.dao.postgres;

import geradatawarehouse.bean.Unidade;
import geradatawarehouse.dao.postgres.abs.PostgresDAO;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

public class UnidadePostgresDAO extends PostgresDAO {
	private static final String TRUNCATE_UNIDADE = "truncate unidade";

	protected UnidadePostgresDAO() throws IOException {
		super();
	}

	public void replaceAll(final List<Unidade> lista) throws SQLException {

		if (lista.isEmpty()) {
			return;
		}

		Connection conn = null;

		try {
			conn = this.buildConnection();

			// Commit só no final de tudo.
			conn.setAutoCommit(false);

			final String truncateQuery = UnidadePostgresDAO.TRUNCATE_UNIDADE;

			final Statement smt = conn.createStatement();

			smt.executeUpdate(truncateQuery);

			final StringBuilder queryBuilder = new StringBuilder();

			queryBuilder.append("INSERT INTO unidade(");
			queryBuilder.append("cre, codigo, online, nome)");
			queryBuilder.append("VALUES ");

			for (final Unidade u : lista) {
				queryBuilder.append("('");
				queryBuilder.append(this.escape(u.getCre()));
				queryBuilder.append("', '");
				queryBuilder.append(this.escape(u.getCodigo()));
				queryBuilder.append("', ");
				queryBuilder.append(u.isOnline() ? "TRUE" : "FALSE");
				queryBuilder.append(", '");
				queryBuilder.append(this.escape(u.getNome()));
				queryBuilder.append("')");

				// Próxima tupla
				queryBuilder.append(", ");
			}

			String insertQuery = queryBuilder.toString();

			final int length = insertQuery.length();

			// Remove a última vírgula, que estaria de pois da última tupla.
			insertQuery = insertQuery.substring(0, length - ", ".length());

			smt.executeUpdate(insertQuery);

			conn.commit();

		} catch (final SQLException e) {
			// Não deixar inconsistente a base.
			conn.rollback();
			throw e;
		} finally {
			if (conn != null && !conn.isClosed()) {

				// Efetua o commit, caso não haja rollback, e libera a conexão.
				conn.close();
			}
		}

	}
}
